package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.IdentifierUtil;
import qc.module.ehs.dto.warehouse.WareHouseDto;
import qc.module.ehs.dto.warehouseinventory.WareHouseInventoryDto;
import qc.module.ehs.entity.EhsWarehouseBasic;
import qc.module.ehs.mapper.EhsWarehouseBasicMapper;
import qc.module.ehs.repository.EhsWarehouseBasicRepository;

import java.util.List;
import java.util.Objects;

/**
 * 仓库基本信息接口Service
 *
 * @author QuCheng Tech
 * @create 2024/11/11
 */
@Service
public class EhsWareHouseService {

    @Autowired
    private EhsWarehouseBasicRepository repository;

    @Autowired
    private EhsWarehouseInventoryService warehouseInventoryService;

    /**
     * 获取所有仓库信息
     *
     * @param id 组织机构代码
     * @return List<WareHouseDto>
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    public List<WareHouseDto> getAll(String id) {
        LambdaQueryWrapper<EhsWarehouseBasic> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsWarehouseBasic::getOrgcode, id);
        List<EhsWarehouseBasic> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsWarehouseBasicMapper.MAPPER.toDtoList(ens);
        }
        return null;
    }

    /**
     * 获取指定仓库信息
     *
     * @param id 仓库ID
     * @return WareHouseDto
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    public WareHouseDto get(String id) {
        EhsWarehouseBasic en = repository.selectById(id);
        if (Objects.nonNull(en)) {
            return EhsWarehouseBasicMapper.MAPPER.toDto(en);
        }
        return null;
    }

    /**
     * 新增
     *
     * @param dto 新增对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    public String add(WareHouseDto dto) {
        //1.DTO有效性验证
        if (dto == null)
            return QCUnifyReturnValue.Warn("新增对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            return QCUnifyReturnValue.Warn("所属组织代码不能为空");
        if (StringUtils.isBlank(dto.getName()))
            return QCUnifyReturnValue.Warn("仓库名称不能为空");
        if (StringUtils.isBlank(dto.getLocation()))
            return QCUnifyReturnValue.Warn("仓库位置不能为空");
        if (dto.getDeptid() <= 0x0)
            return QCUnifyReturnValue.Warn("所属部门ID不能为空");

        //2.dto转为entity
        EhsWarehouseBasic en = EhsWarehouseBasicMapper.MAPPER.toEntity(dto);
        en.setId(IdentifierUtil.randomUUID());

        //3.保存数据
        if (repository.insert(en) < 0x1) {
            return QCUnifyReturnValue.Warn("保存失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改
     *
     * @param dto 修改对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    public String update(WareHouseDto dto) {
        //1.DTO有效性验证
        if (dto == null)
            return QCUnifyReturnValue.Warn("新增对象不能为空");
        if (StringUtils.isBlank(dto.getId()))
            return QCUnifyReturnValue.Warn("仓库ID不能为空");
        if (StringUtils.isBlank(dto.getOrgcode()))
            return QCUnifyReturnValue.Warn("所属组织代码不能为空");
        if (StringUtils.isBlank(dto.getName()))
            return QCUnifyReturnValue.Warn("仓库名称不能为空");
        if (StringUtils.isBlank(dto.getLocation()))
            return QCUnifyReturnValue.Warn("仓库位置不能为空");
        if (dto.getDeptid() <= 0x0)
            return QCUnifyReturnValue.Warn("所属部门ID不能为空");

        if (Objects.isNull(repository.selectById(dto.getId())))
            return QCUnifyReturnValue.Warn("仓库信息不存在");

        //2.dto转为entity
        EhsWarehouseBasic en = EhsWarehouseBasicMapper.MAPPER.toEntity(dto);

        //3.更新数据
        repository.updateById(en);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除
     * 如仓库中有出入库记录提示不能删除；
     *
     * @param id 仓库ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/12
     */
    public String delete(String id) {
        //如果仓库下有出入库记录，提示不能删除
        List<WareHouseInventoryDto> records = warehouseInventoryService.getByWareHouseId(id);
        if (CollectionUtils.isNotEmpty(records))
            return QCUnifyReturnValue.Warn("指定仓库下有出入库记录，无法删除。");

        //删除仓库
        repository.deleteById(id);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 获取用户有权限的仓库
     * 根据当前用户获取指定组织机构代码中有访问权限的仓库集合；用户有访问权限才能进行出入库操作和查询；默认上级部门的对下级部门有访问权限；
     * 根据组织机构代码获取对应的部门ID，判断组织机构对应的部门（包含子级部门）与用户关联的部门，有关联的部门即为有访问权限；
     *
     * @param orgcode          组织机构代码
     * @param userValidDeptIds 用户有效部门ID集合
     * @return List<WareHouseDto>
     * @author QuCheng Tech
     * @since 2024/11/21
     */
    public List<WareHouseDto> getUserValid(String orgcode, List<Integer> userValidDeptIds) {
        //获取指定组织机构代码、用户有效部门ID的仓库
        LambdaQueryWrapper<EhsWarehouseBasic> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsWarehouseBasic::getOrgcode, orgcode)
                .in(EhsWarehouseBasic::getDeptid, userValidDeptIds);
        List<EhsWarehouseBasic> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsWarehouseBasicMapper.MAPPER.toDtoList(ens);
        }

        return null;
    }
}
